import 'package:flutter/foundation.dart';
import 'package:netease_cloud_music_api/netease_cloud_music_api.dart';
import 'package:netease_cloud_music_api/utils/request.dart';

mixin User {
  /// 获取账号信息
  /// 说明: 登录后调用此接口 ,可获取用户账号信息
  Future<PlayerRequestResponse> userAccount() {
    return PlayerRequest(
      url: 'https://music.163.com/api/nuser/account/get',
      options: PlayerRequestOptions(method: PlayerRequestMethod.post, crypto: EncryptType.weapi),
    ).request();
  }

  /// 用户创建的电台
  /// 说明: 调用此接口, 传入用户 [uid] 可获取用户创建的电台
  /// [uid] 用户id
  Future<PlayerRequestResponse> userAudio({required int uid}) {
    return PlayerRequest(
      url: 'https://music.163.com/weapi/djradio/get/byuser',
      data: {'userId': uid},
      options: PlayerRequestOptions(method: PlayerRequestMethod.post, crypto: EncryptType.weapi),
    ).request();
  }

  /// 获取用户绑定信息
  /// 说明: 登录后调用此接口 , 可以获取用户绑定信息
  /// [userId] 用户id
  Future<PlayerRequestResponse> userBinding({required int userId}) {
    return PlayerRequest(
      url: 'https://music.163.com/api/v1/user/bindings/$userId',
      options: PlayerRequestOptions(method: PlayerRequestMethod.post, crypto: EncryptType.weapi),
    ).request();
  }

  /// 云盘歌曲删除
  /// 说明 : 登录后调用此接口, 传入云盘歌曲 [songId], 可删除云盘歌曲
  /// [songId]: 歌曲id,可多个
  Future<PlayerRequestResponse> userCloudDel({required List<int> songId}) {
    return PlayerRequest(
      url: 'https://music.163.com/weapi/cloud/del',
      data: {'songIds': songId},
      options: PlayerRequestOptions(method: PlayerRequestMethod.post, crypto: EncryptType.weapi),
    ).request();
  }

  /// 云盘数据详情
  /// 说明: 登录后调用此接口 , 传入云盘歌曲 [songId]，可获取云盘数据详情
  /// [songId]: 歌曲id,可多个
  Future<PlayerRequestResponse> userCloudDetail({required List<int> songId}) {
    return PlayerRequest(
      url: 'https://music.163.com/weapi/v1/cloud/get/byids',
      data: {'songIds': songId},
      options: PlayerRequestOptions(method: PlayerRequestMethod.post, crypto: EncryptType.weapi),
    ).request();
  }

  /// 云盘
  /// 说明: 登录后调用此接口 , 可获取云盘数据 , 获取的数据没有对应 url, 需要再调用一次 songUrl 获取 url
  /// [limit] : 返回数量 , 默认为 30
  /// [offset] : 偏移数量，用于分页 , 如:( 页数 -1 )*30, 其中 30 为 limit 的值 , 默认为 0
  Future<PlayerRequestResponse> userCloud({int? limit, int? offset}) {
    return PlayerRequest(
      url: 'https://music.163.com/weapi/v1/cloud/get/byids',
      data: {'limit': limit ?? 30, 'offset': offset ?? 0},
      options: PlayerRequestOptions(method: PlayerRequestMethod.post, crypto: EncryptType.weapi),
    ).request();
  }

  /// 用户详情
  /// 说明: 登录后调用此接口 , 传入用户 [uid], 可以获取用户详情
  /// [uid] : 用户 id
  Future<PlayerRequestResponse> userDetail({required int uid}) {
    return PlayerRequest(
      url: 'https://music.163.com/weapi/v1/user/detail/$uid',
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 用户电台节目
  /// 说明: 登录后调用此接口 , 传入用户 [uid], 可以获取用户电台
  /// [uid] : 用户 id
  /// [limit] : 返回数量 , 默认为 30
  Future<PlayerRequestResponse> userDj({required int uid, int? limit, int? offset}) {
    return PlayerRequest(
      url: 'https://music.163.com/weapi/dj/program/$uid',
      data: {'limit': limit ?? 30, 'offset': offset ?? 0},
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 用户动态
  /// 说明: 登录后调用此接口 , 传入用户 [uid], 可以获取用户动态
  /// [uid] : 用户 id
  /// [limit] : 返回数量 , 默认为 30
  /// [lastTime] : 返回数据的 lasttime ,默认-1,传入上一次返回结果的 lasttime,将会返回下一页的数据
  Future<PlayerRequestResponse> userEvent({required int uid, int? limit, int? lastTime}) {
    return PlayerRequest(
      url: 'https://music.163.com/api/event/get/$uid',
      data: {'limit': limit ?? 30, 'getcounts': true, 'time': lastTime ?? -1, 'total': true},
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
        cookie: 'os=ios;appver=7.3.27',
      ),
    ).request();
  }

  /// 获取用户粉丝列表
  /// 说明: 登录后调用此接口 , 传入用户 [uid], 可以获取用户粉丝列表
  /// [uid] : 用户 id
  /// [limit] : 返回数量 , 默认为 30
  /// [lastTime] : 返回数据的 lasttime ,默认-1,传入上一次返回结果的 lasttime,将会返回下一页的数据
  Future<PlayerRequestResponse> userFolloweds({required int uid, int? limit, int? lastTime}) {
    return PlayerRequest(
      url: 'https://music.163.com/eapi/user/getfolloweds/$uid',
      data: {'limit': limit ?? 30, 'time': lastTime ?? -1, 'userId': uid},
      options: PlayerRequestOptions(method: PlayerRequestMethod.post, crypto: EncryptType.eapi, url: '/api/user/getfolloweds'),
    ).request();
  }

  /// 获取用户关注列表
  /// 说明: 登录后调用此接口 , 传入用户 [uid], 可以获取用户粉丝列表
  /// [uid] : 用户 id
  /// [limit] : 返回数量 , 默认为 30
  /// [offset] : 偏移数量，用于分页 ,如 :( 页数 -1 )*30, 其中 30 为 [limit] 的值 , 默认为 0
  Future<PlayerRequestResponse> userFollows({required int uid, int? limit, int? offset}) {
    return PlayerRequest(
      url: 'https://music.163.com/weapi/user/getfollows/$uid',
      data: {'limit': limit ?? 30, 'order': true, 'offset': offset ?? 0},
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 获取用户等级信息
  /// 说明: 登录后调用此接口 , 可以获取用户等级信息,包含当前登录天数,听歌次数,下一等级需要的登录天数和听歌次数,
  /// 当前等级进度,对应 https://music.163.com/#/user/level
  Future<PlayerRequestResponse> userLevel() {
    return PlayerRequest(
      url: 'https://music.163.com/weapi/user/level',
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 获取用户歌单
  /// 说明:  登录后调用此接口 , 传入用户 [uid], 可以获取用户歌单
  /// [uid] : 用户 id
  /// [limit] : 返回数量 , 默认为 30
  /// [offset] : 偏移数量，用于分页 ,如 :( 页数 -1 )*30, 其中 30 为 [limit] 的值 , 默认为 0
  Future<PlayerRequestResponse> userPlaylist({required int uid, int? limit, int? offset}) {
    return PlayerRequest(
      url: 'https://music.163.com/api/user/playlist',
      data: {'limit': limit ?? 30, 'includeVideo': true, 'offset': offset ?? 0, 'uid': uid},
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 获取用户播放记录
  /// 说明:  登录后调用此接口 , 传入用户 [uid], 可获取用户播放记录
  /// [uid] : 用户 id
  /// [type] 当 [type] 为 true 时 返回 所有时间, 当 [type] 为 false 时 返回 最近一周， 默认为false
  Future<PlayerRequestResponse> userRecord({required int uid, bool? type}) {
    type = type ?? false;
    return PlayerRequest(
      url: 'https://music.163.com/weapi/v1/play/record',
      data: {'uid': uid, 'type': type ? 1 : 0},
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 用户绑定手机
  /// 说明:  登录后调用此接口 , 可以更换绑定手机
  /// [phone] : 手机号码
  /// [captcha] : 新手机号码的验证码
  /// [oldCaptcha] : 原手机号码的验证码
  /// [countrycode] : 国家地区代码,默认86
  Future<PlayerRequestResponse> userReplacePhone({
    required int phone,
    required String captcha,
    required String oldCaptcha,
    int? countrycode,
  }) {
    return PlayerRequest(
      url: 'https://music.163.com/api/user/replaceCellphone',
      data: {'phone': phone, 'captcha': captcha, 'oldcaptcha': oldCaptcha, 'countrycode': countrycode ?? 86},
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 获取用户信息 , 歌单，收藏，mv, dj 数量
  /// 说明: 登录后调用此接口 , 可以获取用户信息
  Future<PlayerRequestResponse> userSubCount() {
    return PlayerRequest(
      url: 'https://music.163.com/weapi/subcount',
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 更新用户信息
  /// 说明: 登录后调用此接口 , 传入相关信息,可以更新用户信息
  /// [gender] 性别 0:保密 1:男性 2:女性
  /// [birthday] 出生日期,时间戳 unix timestamp
  /// [cityId] 城市id
  /// [provinceId] 省份id
  /// [signature] 用户签名
  /// [nickname] 用户昵称
  Future<PlayerRequestResponse> userUpdate({
    required int gender,
    required int birthday,
    required int cityId,
    required int provinceId,
    required String signature,
    required String nickname,
  }) {
    Map<String, dynamic> data = {
      'avatarImgId': '0',
      'birthday': birthday,
      'city': cityId,
      'gender': gender > 2 ? 2 : (gender < 0 ? 0 : gender),
      'nickname': nickname,
      'province': provinceId,
      'signature': signature
    };

    return PlayerRequest(
      url: 'https://music.163.com/weapi/user/profile/update',
      data: data,
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }
}
